package com.sfj.system.service.role;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sfj.common.exception.CheckException;
import com.sfj.system.dto.role.RoleInfoDTO;
import com.sfj.system.dto.role.RoleInfoRes;
import com.sfj.system.dto.role.RoleInfoUpdDTO;
import com.sfj.system.dto.role.RoleQueryDTO;
import com.sfj.system.dto.userinfo.UserInfoQueryDTO;
import com.sfj.system.entity.RoleInfoEntity;
import com.sfj.system.entity.UserInfoEntity;
import com.sfj.system.mapper.RoleInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author kaka
 * @Date 2025/06/29
 */
@Service
public class RoleInfoService {
    @Autowired
    private RoleInfoMapper roleInfoMapper;

    public RoleInfoEntity getById(Integer id) {
        return roleInfoMapper.selectByPrimaryKey(id);
    }

    public RoleQueryDTO getRoleWithFuncIds(Integer roleId) {
        RoleInfoEntity entity = roleInfoMapper.selectByPrimaryKey(roleId);
        if (entity == null) throw new CheckException("角色不存在");

        RoleQueryDTO dto = new RoleQueryDTO();
        dto.setRoleId(entity.getRoleId());
        dto.setRoleName(entity.getRoleName());
        dto.setRoleLevel(entity.getRoleLevel());

        List<String> funcIds = roleInfoMapper.selectFuncListByRoleId(roleId);
        dto.setFuncList(funcIds);

        return dto;
    }

    public List<RoleInfoRes> queryRoleList() {
        return roleInfoMapper.queryList();
    }

    public IPage<RoleInfoEntity> queryRoleList(RoleQueryDTO roleQueryDTO) {
        Page<RoleInfoEntity> page =
                new Page<>(roleQueryDTO.getPageNo(), roleQueryDTO.getPageSize());
        return roleInfoMapper.queryRoleInfoList(page, roleQueryDTO);
    }


    @Transactional
    public void createRole(RoleInfoDTO dto) {
        RoleInfoEntity entity = new RoleInfoEntity();
        entity.setRoleName(dto.getRoleName());
        entity.setRoleLevel(dto.getRoleLevel());
        entity.setCreateTime(LocalDateTime.now().withNano(0));
        entity.setUpdateTime(LocalDateTime.now().withNano(0));

        roleInfoMapper.insert(entity);

        if (dto.getFuncList() != null && !dto.getFuncList().isEmpty()) {
            roleInfoMapper.insertFuncMap(entity.getRoleId(), dto.getFuncList());
        }
    }

    public void updateRole(RoleInfoUpdDTO dto) {
        RoleInfoEntity entity = new RoleInfoEntity();
        entity.setRoleId(dto.getRoleId());
        entity.setRoleName(dto.getRoleName());
        entity.setRoleLevel(dto.getRoleLevel());
        entity.setUpdateTime(LocalDateTime.now().withNano(0));

        roleInfoMapper.updateById(entity);

        roleInfoMapper.deleteFuncMapByRoleId(dto.getRoleId());
        if (dto.getFuncList() != null && !dto.getFuncList().isEmpty()) {
            roleInfoMapper.insertFuncMap(dto.getRoleId(), dto.getFuncList());
        }
    }

    public void deleteRole(Integer id) {
        roleInfoMapper.deleteFuncMapByRoleId(id);
        roleInfoMapper.deleteById(id);
    }
}
